<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
  // 什么是原型？
  // 每一对象都有一个__proto__我们称为原型（又称隐式原型）
  // 原型的本质，也是一个对象。
//   let obj = {};
//   console.log(obj);
//   let arr = [];
//   console.log(arr);


// let arr = [1,2,3,4];
// arr.forEach(item => {
//     console.log(item);
// })
     
// let obj = {
//   name:"诸葛亮",
//   des: "草船借箭",
//   sing:function(){
//     return this.name
//   }
// }
// console.log(obj);
// console.log(obj.sing());
// console.log(obj.toString());
// console.log(obj.add());

// 为了方便开发，我们一般习惯，把公用的方法，或者属性挂在到原型上。



// 在创建对象的时候，我们就要给他写进去了。


function Start(){// 构造函数，用来创建对象的。
   this.name = "小四"
}
Start.prototype.sing = function(){
  console.log('我是原型的方法');
  console.log(this);
}
// 注意：在原型的方法里面，this 指向的是构造出来的对象
let obj = new Start();

obj.sing();
console.log(obj);
console.log(obj.length);
// // prototype 又叫显示原型。
// console.log(Start.prototype === obj.__proto__);


// 每一个原型上都有一个 constructor 属性指向 构造函数本身。

// let obj1 = 1;
// console.log(obj1.constructor === Number);


Array.prototype.add = function(){
  let num = 0;
  for (let i = 0; i < this.length; i++) {
    num+=this[i]
  }
  return num;
}

let arr = [1,2,3,4,5];

let arr1 = [6,7,8]
console.log(arr.add()); // 15
console.log(arr1.add());



// 什么是原型链？
// 当试图访问⼀个对象的属性时，它不仅仅在该对象上搜寻，还会搜寻该对象的原型，以及该对象的原型的原型，依次层层向上搜索，直到找到⼀个名字匹配的属性或到达原型链的末尾



</script>